#ifndef _SCHEDULER_H
#define _SCHEDULER_H

#include <stdint.h>

/* Config */

/**
 * 最大任务数
 */
#define SCHEDULER_TASK_MAX_NUM 16

/**
 * Tick 的类型
 */
typedef uint32_t SchedulerTaskTick;

/* Config */

#define SCHEDULER_GET_ARG(task) (task->arg)         // 获取参数宏
#define SCHEDULER_RUN_TASK(task) (task->func(task)) // 运行任务宏

// 定义任务状态标志位
typedef enum
{
    SCHEDULER_TASK_NONE = 0,
    SCHEDULER_TASK_RUNNING,
    SCHEDULER_TASK_STOPPED
} SchedulerTaskStatus;

// 定义任务函数类型，传入任务指针句柄。
typedef void (*SchedulerTaskFunc)(void *);

// 任务句柄结构体
typedef struct SchedulerTaskHandler
{
    SchedulerTaskStatus status; // 当前任务状态标志位
    SchedulerTaskTick interval; // 任务执行间隔，0则是单次执行
    SchedulerTaskFunc func;     // 任务函数
    void *arg;                  // 任务函数的参数
    SchedulerTaskTick tick;     // 任务执行倒计时
    uint8_t *task_num_p;        // 调度器任务计数器指针
} SchedulerTaskHandler;

// 调度器句柄结构体
typedef struct
{
    uint8_t task_num;
    SchedulerTaskHandler tasks[SCHEDULER_TASK_MAX_NUM];
} SchedulerHandler;

void SchedulerInit(SchedulerHandler *scheduler); // 初始化调度器
void SchedulerTick(SchedulerHandler *scheduler); // 调度器主循环
SchedulerTaskTick SchedulerGetTick(void);        // 调度器 Tick 获取函数

SchedulerTaskHandler *SchedulerAddTask(SchedulerHandler *scheduler, SchedulerTaskFunc func, void *arg, SchedulerTaskTick delay, SchedulerTaskTick interval); // 添加任务
void SchedulerRemoveTask(SchedulerTaskHandler *task);                                                                                                        // 删除任务
void SchedulerResumeTask(SchedulerTaskHandler *task);                                                                                                        // 恢复任务
void SchedulerStopTask(SchedulerTaskHandler *task);                                                                                                          // 停止任务

#endif /* _SCHEDULER_H */
